package br.com.jk.usuario;

import br.com.jk.cliente.Cliente;
import br.com.jk.cliente.ClienteRn;
import br.com.jk.email.EmailJDialog;
import br.com.jk.empresa.Empresa;
import br.com.jk.empresa.EmpresaRn;
import br.com.jk.telefone.TelefoneJDialog;
import br.com.jk.usuario.permissoes.Permissao;
import br.com.jk.usuario.permissoes.PermissaoRn;
import br.com.jk.usuario.permissoes.Regra;
import br.com.jk.usuario.permissoes.RegraRn;
import br.com.jk.util.ControllerException;
import br.com.jk.util.RNException;
import br.com.jk.util.pesquisa.Pesquisa;
import br.com.jk.util.pesquisa.Pesquisa.Tipo;
import br.com.jk.util.pesquisa.PesquisaJDialog;
import java.util.List;
import net.sf.jasperreports.engine.JRException;

/**
 *
 * @author camilo
 */
public class UsuarioController {

  private Usuario produto;
  private EmailJDialog emJDialog;
  private TelefoneJDialog telJDialog;
  private int colunaSel;
  private int idEmpresa;
  public boolean modoConsulta;
  private Pesquisa pesquisa = new Pesquisa();

  public UsuarioController() {
    this.produto = new Usuario();
  }

  /**
   * Verifica se todos os campos estão preenchidos, com excessão do campo jtfId
   *
   * @return
   */
  public boolean isNotNull() {
    /*if (dialog.getJtfCnpj().getText().isEmpty()) {
     Util.msgAdv("Campo \"CNPJ\" vazio.");
     dialog.getJtfCnpj().requestFocus();
     return false;
     } else if (dialog.getJtfIe().getText().isEmpty()) {
     Util.msgAdv("Campo \"IE\" vazio.");
     dialog.getJtfIe().requestFocus();
     return false;
     } else if (dialog.getJtfRazao().getText().isEmpty()) {
     Util.msgAdv("Campo \"Razão\" vazio.");
     dialog.getJtfRazao().requestFocus();
     return false;
     } else if (dialog.getJtfIdCidade().getText().isEmpty()) {
     Util.msgAdv("Campo \"Id Cidade\" vazio.");
     dialog.getJtfIdCidade().requestFocus();
     return false;
     } else if (dialog.getJtfCep().getText().isEmpty()) {
     Util.msgAdv("Campo \"CEP\" vazio.");
     dialog.getJtfCep().requestFocus();
     return false;
     } else if (dialog.getJtfRua().getText().isEmpty()) {
     Util.msgAdv("Campo \"Endereço\" vazio.");
     dialog.getJtfRua().requestFocus();
     return false;
     } else if (dialog.getJtfBairro().getText().isEmpty()) {
     Util.msgAdv("Campo \"Bairro\" vazio.");
     dialog.getJtfBairro().requestFocus();
     return false;
     } else if (dialog.getJtfNumero().getText().isEmpty()) {
     Util.msgAdv("Campo \"Nº\" vazio.");
     dialog.getJtfNumero().requestFocus();
     return false;
     } else if (dialog.getJtfFantasia().getText().isEmpty()) {
     Util.msgAdv("Campo \"Nome Fantasia\" vazio.");
     dialog.getJtfFantasia().requestFocus();
     return false;
     }*/
    return true;
  }

  public void salvar(Usuario produto) {
    if (produto != null) {
      UsuarioRn produtoRn = new UsuarioRn();
      //faz a conexão com o bd e salva os registros
      produtoRn.salvar(produto);
    }
  }

  public List<Permissao> listarPermissoes(Usuario usuario) {
    PermissaoRn permissaoRn = new PermissaoRn();
    RegraRn regraRn = new RegraRn();
    List<Permissao> permUsuario = permissaoRn.listar(usuario);
    List<Regra> regras = regraRn.listar();

//    Se a lista de regras cadastradas for maior que a lista já salva no banco de dados para o usuário
    if (regras.size() > permUsuario.size()) {
//      o laço começa a partir do tamanho da lista já salva para o usuário, ou seja, só irá cadastrar os novos
      for (int i = permUsuario.size(); i < regras.size(); i++) {

        PermissaoRn prn = new PermissaoRn();
        Permissao p = new Permissao();

        p.setHabilitado(false);
        p.setRegra(regras.get(i));
        p.setUsuario(usuario);

        prn.salvar(p);
      }
    }
    return permissaoRn.listar(usuario);//Faz uma consulta novamente após a verificação para garantir que os dados novos já sejam exibidos
  }

  public List<Usuario> listar() {
    UsuarioRn prn = new UsuarioRn();
    return prn.listar();
  }

  public void excluir(Usuario produto) {
    UsuarioRn fornRn = new UsuarioRn();
    fornRn.excluir(produto);
  }

  /**
   * Habilita a pesquisa somente para os campos configurados nesse método
   *
   * @param coluna Índice da coluna da qual se deseja efetuar a pesquisa
   * @return Se o campo estiver habilitado permite a pesquisa. O default é: false;
   */
  public boolean setEnabledPesquisa(int coluna) {
    colunaSel = coluna;
    switch (coluna) {
      case UsuarioTableModel.COLUNA_COD_NOME:
        pesquisa.setTipo(Pesquisa.Tipo.STRING);
        return true;
      case UsuarioTableModel.COLUNA_COD_NOME_COMPLETO:
        pesquisa.setTipo(Pesquisa.Tipo.STRING);
        return true;
      case UsuarioTableModel.COLUNA_COD_COD:
        pesquisa.setTipo(Pesquisa.Tipo.STRING);
        return true;
      case UsuarioTableModel.COLUNA_COD_DATA_CADASTRO:
        pesquisa.setTipo(Pesquisa.Tipo.DATE);
        return true;
      default:
        return false;
    }
  }

  public Pesquisa getCriterio(Tipo tipo) {
    return PesquisaJDialog.getCriterio(pesquisa.getTipo());
  }

  public void pesquisar() {
    /*Pesquisa pesq;
     if (modoConsulta) { //Se estiver habilitada a pesquisa executa o cod abaixo
     UsuarioRn usRn = new UsuarioRn();

     //        Verifica qual é o tipo de campo e executa a consulta específica
     switch (colunaSel) {
     case ProdutoTableModel.COLUNA_COD_ID:
     pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
     if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
     setJtFornTM(usRn.pesquisaPadrao(Produto.ATTRIBUTE_ID, Integer.parseInt(pesq.getCriterio()), pesq.getOpcao()));
     }
     break;
     case ProdutoTableModel.COLUNA_COD_CODEAN:
     pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
     if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
     setJtFornTM(usRn.pesquisaPadrao(Produto.ATTRIBUTE_DESCRICAO, pesq.getCriterio(), pesq.getOpcao()));
     }
     break;
     case ProdutoTableModel.COLUNA_COD_DESCRICAO:
     pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
     if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
     setJtFornTM(usRn.pesquisaPadrao(Produto.ATTRIBUTE_EMBALAGEM, pesq.getCriterio(), pesq.getOpcao()));
     }
     break;
     //*case FornecedorTableModel.COLUNA_COD_CIDADE:
     // pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
     //if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
     //setJtFornTM(ctrn.pesquisaPadrao(Fornecedor.ATTRIBUTE_, pesq.getCriterio()));
     // }
     //break;
     case ProdutoTableModel.COLUNA_COD_PRECO_VENDA:
     pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
     if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
     setJtFornTM(usRn.pesquisaPadrao(Produto.ATTRIBUTE_ATIVO, pesq.getCriterio(), pesq.getOpcao()));
     }
     break;
     case ProdutoTableModel.COLUNA_COD_EMBALAGEM:
     pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
     if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
     setJtFornTM(usRn.pesquisaPadrao(Produto.ATTRIBUTE_PRECO_VENDA, pesq.getCriterio(), pesq.getOpcao()));
     }
     break;
     }
     dialog.getJlFiltro().setVisible(true);
     dialog.getJbBuscar().setEnabled(false);
     limpar();
     }*/
  }

  public void report() throws JRException, Exception {
    UsuarioReport mReport = new UsuarioReport();
    mReport.geraRelatorio();
//    Master.setTextJlStatus("");
//    Master.setJpbStatusIndeterminate(false);
  }

  public Empresa carregaEmpresa(int idEmpresa) throws ControllerException {
    EmpresaRn empresaRn = new EmpresaRn();
    Empresa empresa;
    try {
      empresa = empresaRn.carregar(idEmpresa);
    } catch (RNException ex) {
      throw new ControllerException("Não foi encontrado nenhum registro");
    }
    return empresa;
  }

  public Cliente carregaCliente(int idCliente) {
    ClienteRn clienteRn = new ClienteRn();
    Cliente cliente = clienteRn.carregar(idCliente);
    return cliente;
  }

  public void alteraPermissao(Integer id, Boolean habilitado) {
    PermissaoRn permissaoRn = new PermissaoRn();
    Permissao permissao = permissaoRn.carregar(id);
    permissao.setHabilitado(habilitado);
    permissaoRn.salvar(permissao);
  }

  public Usuario getProduto() {
    return produto;
  }

  public void setProduto(Usuario produto) {
    this.produto = produto;
  }

  public boolean isModoConsulta() {
    return modoConsulta;
  }

  public void setModoConsulta(boolean modoConsulta) {
    this.modoConsulta = modoConsulta;
  }
}
